<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/completion.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/completion.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="Maybe">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X19MSU5VWF9DT01QTEVUSU9OX0hfMA__"><span class="b">__LINUX_COMPLETION_H</span></a>
<a name="2" /><span class="Maybe">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19MSU5VWF9DT01QTEVUSU9OX0hfMA__"><span class="b">__LINUX_COMPLETION_H</span></a>
<a name="3" /><span class="Maybe">       3:</span> 
<a name="4" /><span class="Maybe">       4:</span> <span class="k">/*</span>
<a name="5" /><span class="Maybe">       5:</span> <span class="k"> * (C) Copyright 2001 Linus Torvalds</span>
<a name="6" /><span class="Maybe">       6:</span> <span class="k"> *</span>
<a name="7" /><span class="Maybe">       7:</span> <span class="k"> * Atomic wait-for-completion handler data structures.</span>
<a name="8" /><span class="Maybe">       8:</span> <span class="k"> * See kernel/sched/completion.c for details.</span>
<a name="9" /><span class="Maybe">       9:</span> <span class="k"> */</span>
<a name="10" /><span class="Maybe">      10:</span> 
<a name="11" /><span class="Maybe">      11:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">wait</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="12" /><span class="Maybe">      12:</span> 
<a name="13" /><span class="Maybe">      13:</span> <span class="k">/*</span>
<a name="14" /><span class="Maybe">      14:</span> <span class="k"> * struct completion - structure used to maintain state for a &quot;completion&quot;</span>
<a name="15" /><span class="Maybe">      15:</span> <span class="k"> *</span>
<a name="16" /><span class="Maybe">      16:</span> <span class="k"> * This is the opaque structure used to maintain the state for a &quot;completion&quot;.</span>
<a name="17" /><span class="Maybe">      17:</span> <span class="k"> * Completions currently use a FIFO to queue threads that have to wait for</span>
<a name="18" /><span class="Maybe">      18:</span> <span class="k"> * the &quot;completion&quot; event.</span>
<a name="19" /><span class="Maybe">      19:</span> <span class="k"> *</span>
<a name="20" /><span class="Maybe">      20:</span> <span class="k"> * See also:  complete(), wait_for_completion() (and friends _timeout,</span>
<a name="21" /><span class="Maybe">      21:</span> <span class="k"> * _interruptible, _interruptible_timeout, and _killable), init_completion(),</span>
<a name="22" /><span class="Maybe">      22:</span> <span class="k"> * reinit_completion(), and macros DECLARE_COMPLETION(),</span>
<a name="23" /><span class="Maybe">      23:</span> <span class="k"> * DECLARE_COMPLETION_ONSTACK().</span>
<a name="24" /><span class="Maybe">      24:</span> <span class="k"> */</span>
<a name="25" /><span class="Maybe">      25:</span> <span class="m">struct</span> <span class="b">completion</span> <span class="f">{</span>
<a name="26" /><span class="Maybe">      26:</span>     <span class="m">unsigned</span> <span class="m">int</span> <span class="b">done</span><span class="f">;</span>
<a name="27" /><span class="Maybe">      27:</span>     <span class="b">wait_queue_head_t</span> <span class="b">wait</span><span class="f">;</span>
<a name="28" /><span class="Maybe">      28:</span> <span class="f">}</span><span class="f">;</span>
<a name="29" /><span class="Maybe">      29:</span> 
<a name="30" /><span class="Maybe">      30:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Q09NUExFVElPTl9JTklUSUFMSVpFUl8w"><span class="b">COMPLETION_INITIALIZER</span></a><span class="f">(</span><span class="b">work</span><span class="f">)</span> \
<a name="31" /><span class="Maybe">      31:</span>     <span class="f">{</span> <span class="c">0</span><span class="f">,</span> <a href="cpu.c_macros_noref.html#_X19XQUlUX1FVRVVFX0hFQURfSU5JVElBTElaRVJfMA__"><span class="b">__WAIT_QUEUE_HEAD_INITIALIZER</span></a><span class="f">(</span><span class="f">(</span><span class="b">work</span><span class="f">)</span><span class="f">.</span><span class="b">wait</span><span class="f">)</span> <span class="f">}</span>
<a name="32" /><span class="Maybe">      32:</span> 
<a name="33" /><span class="Maybe">      33:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Q09NUExFVElPTl9JTklUSUFMSVpFUl9PTlNUQUNLXzA_"><span class="b">COMPLETION_INITIALIZER_ONSTACK</span></a><span class="f">(</span><span class="b">work</span><span class="f">)</span> \
<a name="34" /><span class="Maybe">      34:</span>     <span class="f">(</span><span class="f">{</span> <span class="b">init_completion</span><span class="f">(</span><span class="f">&amp;</span><span class="b">work</span><span class="f">)</span><span class="f">;</span> <span class="b">work</span><span class="f">;</span> <span class="f">}</span><span class="f">)</span>
<a name="35" /><span class="Maybe">      35:</span> 
<a name="36" /><span class="Maybe">      36:</span> <span class="k">/**</span>
<a name="37" /><span class="Maybe">      37:</span> <span class="k"> * DECLARE_COMPLETION - declare and initialize a completion structure</span>
<a name="38" /><span class="Maybe">      38:</span> <span class="k"> * @work:  identifier for the completion structure</span>
<a name="39" /><span class="Maybe">      39:</span> <span class="k"> *</span>
<a name="40" /><span class="Maybe">      40:</span> <span class="k"> * This macro declares and initializes a completion structure. Generally used</span>
<a name="41" /><span class="Maybe">      41:</span> <span class="k"> * for static declarations. You should use the _ONSTACK variant for automatic</span>
<a name="42" /><span class="Maybe">      42:</span> <span class="k"> * variables.</span>
<a name="43" /><span class="Maybe">      43:</span> <span class="k"> */</span>
<a name="44" /><span class="Maybe">      44:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_REVDTEFSRV9DT01QTEVUSU9OXzA_"><span class="b">DECLARE_COMPLETION</span></a><span class="f">(</span><span class="b">work</span><span class="f">)</span> \
<a name="45" /><span class="Maybe">      45:</span>     <span class="m">struct</span> <span class="b">completion</span> <span class="b">work</span> <span class="f">=</span> <a href="cpu.c_macros_noref.html#_Q09NUExFVElPTl9JTklUSUFMSVpFUl8w"><span class="b">COMPLETION_INITIALIZER</span></a><span class="f">(</span><span class="b">work</span><span class="f">)</span>
<a name="46" /><span class="Maybe">      46:</span> 
<a name="47" /><span class="Maybe">      47:</span> <span class="k">/*</span>
<a name="48" /><span class="Maybe">      48:</span> <span class="k"> * Lockdep needs to run a non-constant initializer for on-stack</span>
<a name="49" /><span class="Maybe">      49:</span> <span class="k"> * completions - so we use the _ONSTACK() variant for those that</span>
<a name="50" /><span class="Maybe">      50:</span> <span class="k"> * are on the kernel stack:</span>
<a name="51" /><span class="Maybe">      51:</span> <span class="k"> */</span>
<a name="52" /><span class="Maybe">      52:</span> <span class="k">/**</span>
<a name="53" /><span class="Maybe">      53:</span> <span class="k"> * DECLARE_COMPLETION_ONSTACK - declare and initialize a completion structure</span>
<a name="54" /><span class="Maybe">      54:</span> <span class="k"> * @work:  identifier for the completion structure</span>
<a name="55" /><span class="Maybe">      55:</span> <span class="k"> *</span>
<a name="56" /><span class="Maybe">      56:</span> <span class="k"> * This macro declares and initializes a completion structure on the kernel</span>
<a name="57" /><span class="Maybe">      57:</span> <span class="k"> * stack.</span>
<a name="58" /><span class="Maybe">      58:</span> <span class="k"> */</span>
<a name="59" /><span class="False">      59:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_LOCKDEP</span>
<a name="60" /><span class="False">      60:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_REVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0tfMA__"><span class="b">DECLARE_COMPLETION_ONSTACK</span></a><span class="f">(</span><span class="b">work</span><span class="f">)</span> \
<a name="61" /><span class="False">      61:</span>     <span class="m">struct</span> <span class="b">completion</span> <span class="b">work</span> <span class="f">=</span> <a href="cpu.c_macros_noref.html#_Q09NUExFVElPTl9JTklUSUFMSVpFUl9PTlNUQUNLXzA_"><span class="b">COMPLETION_INITIALIZER_ONSTACK</span></a><span class="f">(</span><span class="b">work</span><span class="f">)</span>
<a name="62" /><span class="Maybe">      62:</span> <span class="f">#</span><span class="n">else</span>
<a name="63" /><span class="Maybe">      63:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_REVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0tfMA__"><span class="b">DECLARE_COMPLETION_ONSTACK</span></a><span class="f">(</span><span class="b">work</span><span class="f">)</span> <a href="cpu.c_macros_noref.html#_REVDTEFSRV9DT01QTEVUSU9OXzA_"><span class="b">DECLARE_COMPLETION</span></a><span class="f">(</span><span class="b">work</span><span class="f">)</span>
<a name="64" /><span class="Maybe">      64:</span> <span class="f">#</span><span class="n">endif</span>
<a name="65" /><span class="Maybe">      65:</span> 
<a name="66" /><span class="Maybe">      66:</span> <span class="k">/**</span>
<a name="67" /><span class="Maybe">      67:</span> <span class="k"> * init_completion - Initialize a dynamically allocated completion</span>
<a name="68" /><span class="Maybe">      68:</span> <span class="k"> * @x:  pointer to completion structure that is to be initialized</span>
<a name="69" /><span class="Maybe">      69:</span> <span class="k"> *</span>
<a name="70" /><span class="Maybe">      70:</span> <span class="k"> * This inline function will initialize a dynamically created completion</span>
<a name="71" /><span class="Maybe">      71:</span> <span class="k"> * structure.</span>
<a name="72" /><span class="Maybe">      72:</span> <span class="k"> */</span>
<a name="73" /><span class="Maybe">      73:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">init_completion</span><span class="f">(</span><span class="m">struct</span> <span class="b">completion</span> <span class="f">*</span><span class="b">x</span><span class="f">)</span>
<a name="74" /><span class="Maybe">      74:</span> <span class="f">{</span>
<a name="75" /><span class="Maybe">      75:</span>     <span class="b">x</span><span class="f">-&gt;</span><span class="b">done</span> <span class="f">=</span> <span class="c">0</span><span class="f">;</span>
<a name="76" /><span class="Maybe">      76:</span>     <a href="cpu.c_macros_ref.html#_aW5pdF93YWl0cXVldWVfaGVhZF8w"><span class="b">init_waitqueue_head</span></a><span class="f">(</span><span class="f">&amp;</span><span class="b">x</span><span class="f">-&gt;</span><span class="b">wait</span><span class="f">)</span><span class="f">;</span>
<a name="77" /><span class="Maybe">      77:</span> <span class="f">}</span>
<a name="78" /><span class="Maybe">      78:</span> 
<a name="79" /><span class="Maybe">      79:</span> <span class="k">/**</span>
<a name="80" /><span class="Maybe">      80:</span> <span class="k"> * reinit_completion - reinitialize a completion structure</span>
<a name="81" /><span class="Maybe">      81:</span> <span class="k"> * @x:  pointer to completion structure that is to be reinitialized</span>
<a name="82" /><span class="Maybe">      82:</span> <span class="k"> *</span>
<a name="83" /><span class="Maybe">      83:</span> <span class="k"> * This inline function should be used to reinitialize a completion structure so it can</span>
<a name="84" /><span class="Maybe">      84:</span> <span class="k"> * be reused. This is especially important after complete_all() is used.</span>
<a name="85" /><span class="Maybe">      85:</span> <span class="k"> */</span>
<a name="86" /><span class="Maybe">      86:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">reinit_completion</span><span class="f">(</span><span class="m">struct</span> <span class="b">completion</span> <span class="f">*</span><span class="b">x</span><span class="f">)</span>
<a name="87" /><span class="Maybe">      87:</span> <span class="f">{</span>
<a name="88" /><span class="Maybe">      88:</span>     <span class="b">x</span><span class="f">-&gt;</span><span class="b">done</span> <span class="f">=</span> <span class="c">0</span><span class="f">;</span>
<a name="89" /><span class="Maybe">      89:</span> <span class="f">}</span>
<a name="90" /><span class="Maybe">      90:</span> 
<a name="91" /><span class="Maybe">      91:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">wait_for_completion</span><span class="f">(</span><span class="m">struct</span> <span class="b">completion</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="92" /><span class="Maybe">      92:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">wait_for_completion_io</span><span class="f">(</span><span class="m">struct</span> <span class="b">completion</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="93" /><span class="Maybe">      93:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">wait_for_completion_interruptible</span><span class="f">(</span><span class="m">struct</span> <span class="b">completion</span> <span class="f">*</span><span class="b">x</span><span class="f">)</span><span class="f">;</span>
<a name="94" /><span class="Maybe">      94:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">wait_for_completion_killable</span><span class="f">(</span><span class="m">struct</span> <span class="b">completion</span> <span class="f">*</span><span class="b">x</span><span class="f">)</span><span class="f">;</span>
<a name="95" /><span class="Maybe">      95:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">wait_for_completion_timeout</span><span class="f">(</span><span class="m">struct</span> <span class="b">completion</span> <span class="f">*</span><span class="b">x</span><span class="f">,</span>
<a name="96" /><span class="Maybe">      96:</span>                            <span class="m">unsigned</span> <span class="m">long</span> <span class="b">timeout</span><span class="f">)</span><span class="f">;</span>
<a name="97" /><span class="Maybe">      97:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">wait_for_completion_io_timeout</span><span class="f">(</span><span class="m">struct</span> <span class="b">completion</span> <span class="f">*</span><span class="b">x</span><span class="f">,</span>
<a name="98" /><span class="Maybe">      98:</span>                             <span class="m">unsigned</span> <span class="m">long</span> <span class="b">timeout</span><span class="f">)</span><span class="f">;</span>
<a name="99" /><span class="Maybe">      99:</span> <span class="m">extern</span> <span class="m">long</span> <span class="b">wait_for_completion_interruptible_timeout</span><span class="f">(</span>
<a name="100" /><span class="Maybe">     100:</span>     <span class="m">struct</span> <span class="b">completion</span> <span class="f">*</span><span class="b">x</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">timeout</span><span class="f">)</span><span class="f">;</span>
<a name="101" /><span class="Maybe">     101:</span> <span class="m">extern</span> <span class="m">long</span> <span class="b">wait_for_completion_killable_timeout</span><span class="f">(</span>
<a name="102" /><span class="Maybe">     102:</span>     <span class="m">struct</span> <span class="b">completion</span> <span class="f">*</span><span class="b">x</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">timeout</span><span class="f">)</span><span class="f">;</span>
<a name="103" /><span class="Maybe">     103:</span> <span class="m">extern</span> <span class="m">bool</span> <span class="b">try_wait_for_completion</span><span class="f">(</span><span class="m">struct</span> <span class="b">completion</span> <span class="f">*</span><span class="b">x</span><span class="f">)</span><span class="f">;</span>
<a name="104" /><span class="Maybe">     104:</span> <span class="m">extern</span> <span class="m">bool</span> <span class="b">completion_done</span><span class="f">(</span><span class="m">struct</span> <span class="b">completion</span> <span class="f">*</span><span class="b">x</span><span class="f">)</span><span class="f">;</span>
<a name="105" /><span class="Maybe">     105:</span> 
<a name="106" /><span class="Maybe">     106:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">complete</span><span class="f">(</span><span class="m">struct</span> <span class="b">completion</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="107" /><span class="Maybe">     107:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">complete_all</span><span class="f">(</span><span class="m">struct</span> <span class="b">completion</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="108" /><span class="Maybe">     108:</span> 
<a name="109" /><span class="True">     109:</span> <span class="f">#</span><span class="n">endif</span>
<a name="110" /><span class="True">     110:</span> </pre>
  </body>
</html>
